import rateLimit from 'express-rate-limit';
import { Request, Response } from 'express';
import { createError } from '../types/errors';
import { ErrorCodes } from '../constants/errorCodes';

// 定义速率限制选项
const limiterOptions = {
  windowMs: 15 * 60 * 1000, // 15分钟窗口
  max: 100, // 每个IP在时间窗口内最多100个请求
  standardHeaders: true, // 返回标准的RateLimit头部
  legacyHeaders: false, // 禁用废弃的X-RateLimit头部
  message: {
    success: false,
    error: {
      code: ErrorCodes.RATE_LIMIT_EXCEEDED,
      message: '请求过于频繁，请稍后再试'
    }
  },
  handler: (req: Request, res: Response) => {
    throw createError(
      ErrorCodes.RATE_LIMIT_EXCEEDED,
      '请求过于频繁，请稍后再试'
    );
  }
};

// API速率限制中间件
export const rateLimiter = rateLimit(limiterOptions);

// 登录速率限制中间件
export const loginRateLimiter = rateLimit({
  ...limiterOptions,
  windowMs: 60 * 60 * 1000, // 1小时窗口
  max: 5, // 每个IP每小时最多5次登录尝试
  message: {
    success: false,
    error: {
      code: ErrorCodes.RATE_LIMIT_EXCEEDED,
      message: '登录尝试次数过多，请1小时后再试'
    }
  }
});

// 注册速率限制中间件
export const registerRateLimiter = rateLimit({
  ...limiterOptions,
  windowMs: 24 * 60 * 60 * 1000, // 24小时窗口
  max: 3, // 每个IP每24小时最多3次注册尝试
  message: {
    success: false,
    error: {
      code: ErrorCodes.RATE_LIMIT_EXCEEDED,
      message: '注册次数已达上限，请24小时后再试'
    }
  }
});
